package com.view.my_view;
import java.util.Random;  
  
import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Matrix;  
import android.graphics.Paint;  
import android.graphics.Bitmap.Config;  
import android.util.AttributeSet;  
import android.util.Log;  
import android.view.View;  
  /**
   * 验证码ImageView，创建时间：2014-10-8
   * @author Administrator
   *
   */
public class ValidateImageView extends View {  
  
    private String TAG = "ValidateImageView";  
    private Paint paint = new Paint();  
    /* 
     * 验证码内容 
     */  
    private String[] content = null;  
    /* 
     * 验证码图片 
     */  
    private Bitmap bitmap = null;  
  
    public ValidateImageView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    public void draw(Canvas canvas) {  
        // TODO Auto-generated method stub  
        if (bitmap != null) {  
            canvas.drawBitmap(bitmap, 0, 0, paint);  
        } else {  
            paint.setColor(Color.GRAY);  
            paint.setTextSize(20);  
            canvas.drawText("点击换一换", 10, 30, paint);  
        }  
        super.draw(canvas);  
    }  
  
    /** 
     * 得到验证码；设置图片 
     * @param strContent 验证码的字符串数组 
     * @return 
     */  
    public String[] getValidataAndSetImage(String[] strContent) {  
        content = strContent;  
        //产生随机数，并返回  
        String [] strRes = generageRadom(strContent);  
//      String strRes = generageRadomStr(strContent);  
        //传随机串和随机数  
        bitmap = generateValidate(content,strRes);  
        invalidate();  
          
        return strRes;  
    }  
  
    private Bitmap generateValidate(String[] strContent,String [] strRes) {  
        int width = 120,height = 50;  
          
        int isRes = isStrContent(strContent);  
        if (isRes == 0) {  
            return null;  
        }  
          
        Bitmap sourceBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
        Canvas canvas = new Canvas(sourceBitmap);  
        Paint p = new Paint();  
        p.setTextSize(height / 2);  
        p.setFakeBoldText(true);  
          
        p.setColor(getRandColor(200, 230, 170));  
        canvas.drawText(strRes[0], 10, height / 2, p);  
        Matrix m1 = new Matrix();  
        m1.setRotate(15);  
        canvas.setMatrix(m1);  
          
        p.setColor(getRandColor(200, 230, 170));  
        canvas.drawText(strRes[1], 40, height / 2, p);  
        m1.setRotate(10);  
        canvas.setMatrix(m1);  
          
        p.setColor(getRandColor(200, 230, 170));  
        canvas.drawText(strRes[2], 70, height / 2 - 10, p);  
        m1.setRotate(15);  
        canvas.setMatrix(m1);  
          
        p.setColor(getRandColor(200, 230, 170));  
        canvas.drawText(strRes[3], 100, height / 2 - 15, p);  
        m1.setRotate(20);  
        canvas.setMatrix(m1);  
          
        //障碍设置  
        int startX = 0,startY = 0,stopX = 0,stopY = 0;  
        for (int i = 0; i < 55; i++) {  
            startX = pointRadom(width);  
            startY = pointRadom(height);  
            stopX = pointRadom(15);  
            stopY = pointRadom(15);  
            p.setColor(getRandColor(200, 230, 220));  
            canvas.drawLine(startX, startY - 20, startX + stopX, startY + stopY - 20, p);  
        }  
          
        canvas.save();  
        return sourceBitmap;  
    }  
      
    private int isStrContent(String[] strContent) {  
        if (strContent == null || strContent.length <= 0) {  
            return 0;  
        } else {  
            return 1;  
        }  
    }  
      
    /** 
     * 从指定数组中随机取出4个字符(数组) 
     * @param strContent 
     * @return 
     */  
    private String[] generageRadom(String[] strContent){  
        String[] str = new String[4];  
        // 随机串的个数  
        int count = strContent.length;  
        // 生成4个随机数  
        Random random = new Random();  
        int randomResFirst = random.nextInt(count);  
        int randomResSecond = random.nextInt(count);  
        int randomResThird = random.nextInt(count);  
        int randomResFourth = random.nextInt(count);  
          
        str[0] = strContent[randomResFirst].toString().trim();  
        str[1] = strContent[randomResSecond].toString().trim();  
        str[2] = strContent[randomResThird].toString().trim();  
        str[3] = strContent[randomResFourth].toString().trim();  
        return str;  
    }  
      
    /** 
     * 从指定数组中随机取出4个字符(字符串) 
     * @param strContent 
     * @return 
     */  
    private String generageRadomStr(String[] strContent){  
        StringBuilder str = new StringBuilder();  
        // 随机串的个数  
        int count = strContent.length;  
        // 生成4个随机数  
        Random random = new Random();  
        int randomResFirst = random.nextInt(count);  
        int randomResSecond = random.nextInt(count);  
        int randomResThird = random.nextInt(count);  
        int randomResFourth = random.nextInt(count);  
          
        str.append(strContent[randomResFirst].toString().trim());  
        str.append(strContent[randomResSecond].toString().trim());  
        str.append(strContent[randomResThird].toString().trim());  
        str.append(strContent[randomResFourth].toString().trim());  
        return str.toString();  
    }  
      
    private int pointRadom(int n){  
        Random r = new Random();  
        return r.nextInt(n);  
    }  
  
    /** 
     * 给定范围获得随机颜色 
     *  
     * @param rc 
     *            0-255 
     * @param gc 
     *            0-255 
     * @param bc 
     *            0-255 
     * @return colorValue 颜色值，使用setColor(colorValue) 
     */  
    public int getRandColor(int rc, int gc, int bc) {  
        Random random = new Random();  
        if (rc > 255)  
            rc = 255;  
        if (gc > 255)  
            gc = 255;  
        if (bc > 255)  
            bc = 255;  
        int r = rc + random.nextInt(rc);  
        int g = gc + random.nextInt(gc);  
        int b = bc + random.nextInt(bc);  
        return Color.rgb(r, g, b);  
    }  
  
}  